....
class CWinApp : public CWinThread
{
.....
Класс CWinThread - это потоки выполняемые в приложении. Главный
поток - это обычно CWinApp. Вообще-то потоки делятся на два типа:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );Видите разницу ??? В первом случае передается адрес процедуры, а во втором адрес класса. Поток может быть создан и из конструктора класса, от которого он унаследован только в таком случае необходимо вызвать CreateThread. Вообще любое приложение Win32 состоит из одного или нескольких процессов. Процесс в простом виде это выполняемое приложение. Операционная система распределяет время в соотвествии со статусами процесса. Именно процесс обеспечивает программу ресурсами, как ,например, адресное пространство, указатели, переменные операционной среды и так далее. Каждый процесс может породить дополнительные процессы.
Давайте создадим свой процесс на нашем диалоговом окне.
UINT MyFunction( LPVOID pParam )
{
for (int x=1;x<10;x++)
{
Sleep(1000);
MessageBeep(-1);
}
return 0;
}
void CTestAppDlg::OnButton6()
{
CWinThread* myWinThread = AfxBeginThread(*MyFunction, NULL);
}
Итак Вы нажимаете на кнопку и процес запускается. Вы можете дальше
продолжать свою работу в то время как производится выполнение процесса и
компьютер бибикает. Как же работает AfxBeginThread ??? А вот пример. CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam); ASSERT_VALID(pThread); if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize, lpSecurityAttrs))Как видите создается новый объект CWinThread и вызывается его функция CreateThread. Соотвественно можно делать и так. Например, поменять код в функции:
void CTestAppDlg::OnButton6()
{
//CWinThread* myWinThread = AfxBeginThread(*MyFunction, NULL);
CWinThread* myTh;
myTh=new CWinThread(*MyFunction,NULL);
myTh->CreateThread();
}
Сам же MFC использует функции _beginthread из Win32 API для создания потоков.